// import com->alibaba->druid->sql->SQLUtils;
// import com->alibaba->druid->sql->ast->*;
// import com->alibaba->druid->sql->visitor->SQLASTVisitor*;

// import java->io->Serializable;
// import java->util->ArrayList;
// import java->util->Collections;
// import java->util->std::list;
#pragma once
#include <string>
#include <list>

#include "../../SQLUtils.h"
// #include "../../visitor/SQLASTVisitor.h"
#include "../../../utils/Serializable.h"
#include "../SQLReplaceable.h"

#include "../SQLExprImpl.h"

class SQLInListExpr : virtual public SQLExprImpl, virtual public SQLReplaceable, virtual public Serializable
{
public:
  static string_ptr class_;
  static long serialVersionUID;
  BOOL_ptr Xnot;
  SQLExpr_ptr expr;
  SQLExpr_list_ptr  targetList;

  // for ads query hint
  SQLCommentHint *hint;

  SQLInListExpr();
  SQLInListExpr(SQLExpr_ptr expr);

  SQLInListExpr(string_ptr  expr, string_list_ptr  values);

  SQLInListExpr(SQLExpr_ptr expr, BOOL_ptr Xnot);
  ~SQLInListExpr(){};
  SHAREDOBJECT(SQLInListExpr);

  // SQLInListExpr *clone();
  virtual SQLObject_ptr clone();

  BOOL_ptr isNot();

  void setNot(BOOL_ptr Xnot);

  SQLExpr_ptr getExpr();

  void setExpr(SQLExpr_ptr expr);

  void addTarget(SQLExpr_ptr x);

  void addTarget(int index, SQLExpr_ptr x);

  SQLExpr_list_ptr  getTargetList();

  BOOL_ptr sortTargetList();

  void setTargetList(SQLExpr_list_ptr  targetList);

  void accept0(SQLASTVisitor_ptr  visitor) ;

  SQLObject_list_ptr  getChildren();

  int hashCode();

  bool equals(Object_ptr obj);

  SQLDataType_ptr computeDataType();

  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  SQLCommentHint *getHint();

  void setHint(SQLCommentHint *hint);
};
